package com.sword.test.framework.demo;

import com.sword.commons.okhttp.HttpResponse;
import com.sword.woodpecker.autotest.framework.annotation.interceptor.http.HttpRequest;
import com.sword.woodpecker.autotest.framework.annotation.interceptor.http.Url;
import com.sword.woodpecker.autotest.framework.aspect.RunOpportunityEnum;
import com.sword.woodpecker.autotest.framework.enums.http.ClientEnum;
import com.sword.woodpecker.autotest.framework.enums.http.MethodEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;


/**
 * 类描述:〈自定义的Http请求类〉
 *
 * @author: xujinjian
 */
@Service
public class MyHttpApi {//类上必须加@Service或者@Component注解，任选一个

    private Logger logger = LoggerFactory.getLogger(this.getClass());


    /**
     * 方法功能描述: 自定义的Get请求
     *
     * @param url
     * @return com.sword.commons.okhttp.HttpResponse
     */
    @HttpRequest(method = MethodEnum.GET)//方法上必须加上@HttpRequest注解，并指明请求method
    public HttpResponse get1(@Url String url) {//方法返回值必须是com.sword.commons.okhttp.HttpResponse
        return null;//方法中的返回值具体内容，随便写，直接返回null也可以
    }


    /**
     * 方法功能描述: 自定义的Get请求
     *
     * @param url
     * @return com.sword.commons.okhttp.HttpResponse
     */
    //方法上必须加上@HttpRequest注解，并指明请求method
    //如果你想指定发送http请求的client，可以client = ClientEnum.HttpClient这样子指明，默认是用OKHttp
    @HttpRequest(method = MethodEnum.GET, client = ClientEnum.HttpClient)
    public HttpResponse get2(@Url String url) {//方法返回值必须是com.sword.commons.okhttp.HttpResponse
        return null;//方法中的返回值具体内容，随便写，直接返回null也可以
    }


    /**
     * 方法功能描述: 自定义的Get请求
     *
     * @param url
     * @return com.sword.commons.okhttp.HttpResponse
     */
    //方法上必须加上@HttpRequest注解，并指明请求method
    //如果你想指定发送http请求的client，可以client = ClientEnum.HttpClient这样子指明，默认是用OKHttp
    //如果你想运行此get3方法，则需加上enableTargetMethod = true, opportunity = RunOpportunityEnum.beforeMethod
    //RunOpportunityEnum.beforeMethod表示先发送http请求，在运行get3方法
    //RunOpportunityEnum.afterMethod表示先运行get3方法，再发送http请求
    @HttpRequest(method = MethodEnum.GET, enableTargetMethod = true, opportunity = RunOpportunityEnum.beforeMethod, client = ClientEnum.HttpClient)
    public HttpResponse get3(@Url String url) {//方法返回值必须是com.sword.commons.okhttp.HttpResponse
        logger.info("请求的地址为[{}]", url);
        return null;//方法中的返回值具体内容，随便写，直接返回null也可以
    }


    /**
     * 方法功能描述: 自定义的Get请求
     *
     * @param url
     * @return com.sword.commons.okhttp.HttpResponse
     */
    //方法上必须加上@HttpRequest注解，并指明请求method
    //如果你想指定发送http请求的client，可以client = ClientEnum.HttpClient这样子指明，默认是用OKHttp
    //如果，你希望先发送http请求，再运行get4方法，并且将http请求后返回的值，传入get4方法
    //则虚加上enableTargetMethod = true, opportunity = RunOpportunityEnum.beforeMethod
    //并且，还需要在get4方法参数上加上com.sword.commons.okhttp.HttpResponse参数，且这个参数必须为null
    @HttpRequest(method = MethodEnum.GET, enableTargetMethod = true, opportunity = RunOpportunityEnum.beforeMethod, client = ClientEnum.HttpClient)
    public HttpResponse get4(@Url String url, HttpResponse response) {
        logger.info("响应状态码为[{}]", response.getCode());
        return null;//方法中的返回值具体内容，随便写，直接返回null也可以
    }

    //除了Get请求，其他请求也是一样的套路去自定义

    //注解说明：
    //1. @HttpRequest注解，标记此方法被动态代理，然后代理方法会去发送Http请求
    //2. @Url注解，标记参数为url参数，必须是String类型，不能为null，也不能为空字符串
    //3. @Header注解，标记参数为header参数，必须是Map<String,String>类型，可以为null
    //4. @Cookie注解，标记参数为Cookie，必须是String类型，可以为null
    //5. @Param注解，标记参数为请求参数，必须是String或者Map<String,String>类型，可以为null
    //6. @Download注解，标记参数为文件下载保存路径参数，必须是String类型，不可为null，也不能为空字符串
    //7. @UploadName注解，标记参数为文件上传时name参数，必须是String或者String数组类型，不可为null
    //8. @UploadFile注解，标记参数为被上传的文件，必须是File或者File数组类型，不可为null


}
